<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <script>
    // 当函数调用call2 用call2的一个参数冒充this 执行调用它的函数
    // 自己写个call2的函数指向call函数的功能
    Function.prototype.call2 = function(){
      // 获取参数列表
      var list = [...arguments]
      // 获取call的第一个参数
      var self = list.shift();
      // list 就是剩余的参数
      // 获取到函数(谁调用call2谁就是this,也就是调用call2函数的函数)
      var  fun = this;
      // 把fun方法挂载到self 对象上
      self.__proto__.fun = fun;
      // 让self 也就是call2的第一个参数调用fun
      self.fun(...list);
      // 清除self的fun
      delete self.__proto__.fun;
    }
    function fun(a,b){
      console.log(this,a,b);
      alert(a+b);
    }

    fun.call2({name:"mumu",age:18},3,5)
  </script>
</body>
</html>